home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 2: Applications
/
Linux Cubed Series 2 - Applications.iso
/
circuits
/
irsim-ca.2
/
irsim-ca
/
irsim-cap-9.2
/
src
/
other
/
h2a
/
Hist.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-02-26
|
5KB
|
233 lines
#include <stdio.h>
#include "defs.h"
#include "net.h"
#include "globals.h"
#include "history.h"
public hptr freeHist = NULL; /* list of free history entries */
public hptr last_hist; /* pointer to dummy hist-entry that
* serves as tail for all nodes */
public hptr first_model; /* first model entry */
public Ulong max_time;
private char inp_chars[] = " i";
private char node_name[256];
private int skip_it = 0;
extern phist *Sort();
private struct
{
phist first;
phist *last;
int num;
char *sv_name;
} theHistory = { NULL, &theHistory.first, 0, NULL };
private void NewHist( tm, delay, rtime, ptime, val, type, name )
long tm;
int delay, rtime, ptime, val, type;
char *name;
{
static phist hfree = NULL;
phist new;
if( (new = hfree) == NULL )
new = (phist) MallocList( sizeof( History ), 1 );
hfree = new->next;
new->time = tm;
new->delay = delay;
new->rtime = rtime;
new->ptime = ptime;
new->name = (type == H_PEND) ? theHistory.sv_name : name;
new->val = vchars[ val ];
new->type = type;
*theHistory.last = new;
theHistory.last = &new->next;
theHistory.num ++;
if( type == H_FIRST or type == H_FIRST_INP )
theHistory.sv_name = name;
}
public void sortAndPrint()
{
phist *data;
long maxv = 0;
register phist *arrp, p;
if( theHistory.first == NULL )
{
if( only_name != NULL )
fprintf( stderr, "%s: NOT found\n", only_name );
else
fprintf( stderr, "EMPTY HISTORY?\n" );
exit( 0 );
}
*theHistory.last = NULL;
data = (phist *) Valloc( (theHistory.num + 1) * sizeof( phist * ), 1 );
for( arrp = data, p = theHistory.first; p != NULL; p = p->next )
{
*arrp++ = p;
if( p->time > maxv ) maxv = p->time;
}
*arrp = NULL;
data = Sort( theHistory.num, data, maxv );
for( arrp = data; (p = *arrp) != NULL; arrp++ )
{
printf( "%10.1f %c%c", d2ns( p->time ), p->val, " i ipP"[p->type] );
if( p->type <= H_FIRST_INP )
{
if( do_delay ) printf( " --" );
if( do_rtime ) printf( " --" );
}
else
{
if( do_delay ) printf( "%8.1f", d2ns( p->delay ) );
if( do_rtime ) printf( "%8.1f", d2ns( p->rtime ) );
if( p->type == H_PUNT and do_delay )
printf( " (%.1f)", d2ns( p->time - p->ptime ) );
}
printf( " %s\n", p->name );
}
}
public void init_hist()
{
static HistEnt dummy;
static HistEnt dummy_model;
max_time = MAX_TIME;
last_hist = &dummy;
dummy.next = last_hist;
dummy.time = max_time;
dummy.val = X;
dummy.inp = 1;
dummy.punt = 0;
dummy.t.r.delay = dummy.t.r.rtime = 0;
}
public void FreeHistList( node ) nptr node; {}
public void SetFirstHist( node, val, inp, time )
nptr node;
int val, inp;
long time;
{
if( only_name != NULL )
{
if( skip_it == 2 ) /* all_done */
{
if( do_sort ) sortAndPrint();
exit( 0 );
}
skip_it = (str_eql( only_name, node->nname ) == 0) ? 2 : 1;
if( skip_it == 1 )
return;
}
if( do_sort )
{
NewHist( time, 0, 0, 0, val, H_FIRST + inp, node->nname );
return;
}
(void) strcpy( node_name, node->nname );
if( not do_names )
printf( "\n%s\n", node_name );
printf( "%10.1f %c%c", d2ns( time ), vchars[ val ], inp_chars[ inp ] );
if( do_delay )
printf( " --" );
if( do_rtime )
printf( " --" );
if( do_names )
printf( " %s", node_name );
putchar( '\n' );
}
public void AddHist( node, val, inp, time, delay, rtime )
nptr node;
int val, inp;
long time, delay, rtime;
{
if( skip_it == 1 )
return;
if( do_sort )
{
NewHist( time, (int) delay, (int) rtime, 0, val, H_NORM + inp,
node->nname );
return;
}
printf( "%10.1f %c%c", d2ns( time ), vchars[ val ], inp_chars[ inp ] );
if( do_delay )
printf( "%8.1f", d2ns( delay ) );
if( do_rtime )
printf( "%8.1f", d2ns( rtime ) );
if( do_names )
printf( " %s", node_name );
putchar( '\n' );
}
public void AddPunted( node, ev, delta )
nptr node;
evptr ev;
long delta;
{
if( skip_it == 1 )
return;
if( do_sort )
{
NewHist( ev->ntime, (int) ev->delay, (int) ev->rtime,
ev->ntime - delta, ev->eval, H_PUNT, node->nname );
return;
}
printf( "%10.1f %cp", d2ns( ev->ntime ), vchars[ ev->eval ] );
if( do_delay )
printf( "%8.1f", d2ns( ev->delay ) );
if( do_rtime )
printf( "%8.1f", d2ns( ev->rtime ) );
if( do_delay )
printf( " (%.1f)", d2ns( delta ) );
if( do_names )
printf( " %s", node_name );
putchar( '\n' );
}
public void enqueue_event( node, val, delay, rtime )
nptr node;
int val;
long delay, rtime;
{
if( skip_it == 1 )
return;
if( do_sort )
{
NewHist( cur_delta + delay, (int) delay, (int) rtime, 0, val, H_PEND,
node->nname );
return;
}
printf( "%10.1f %cP", d2ns( cur_delta + delay ), vchars[ val ] );
if( do_delay )
printf( "%8.1f", d2ns( delay ) );
if( do_rtime )
printf( "%8.1f", d2ns( rtime ) );
if( do_names )
printf( " %s", node_name );
putchar( '\n' );
}